package com.haven123.cloudapp.common.data;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

@Slf4j
public class HighArray{
    private int[] a;
    private int   nElems;
    public HighArray(int size){
        a= new int[size];
        nElems=0;
    }

    /**
     * 线性查找的方法
     * @param el
     * @return
     */
    public boolean find(int el){
        for(int i=0;i<nElems;i++){
            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(a[i]==el){
                return true;
            }
        }
        return false;
    }

    /**
     * 二分查找  猜数字游戏
     * @param el
     * @return
     */
    public boolean erfind(int el){
        int lower=0;
        int upper=nElems-1;
        int curIn;
        while (true){
            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            curIn=(lower+upper)/2;
            if(a[curIn]==el){
                return true;
            }else if(lower>upper){
                return false;
            }else{
                if(a[curIn]<el){
                    lower=curIn+1;
                }else{
                    upper=curIn-1;
                }
            }
        }
    }
    public int insert(int el){
        a[nElems]=el;
        nElems++;
        return nElems;
    }
    public int sortinsert(int el){
        int j;
        for(j=0;j<nElems;j++){
            if (a[j]>el){
                break;
            }
        }
        for(int k=nElems;k>j;k--){
            a[k]=a[k-1];
        }
        a[j]=el;
        nElems++;
        return nElems;
    }
    /**
     * 只能一个一个的删除。
     * @param el
     * @return
     */
    public boolean delete(int el){
        boolean f=false;
        for(int i=0;i<nElems;i++){
            if(a[i]==el){
                f=true;
                if(i==nElems-1){
                    break;
                }
                for(int j=i;j<nElems-1;j++){
                    a[j]=a[j+1];
                }
                nElems--;
                break;
            }
        }
        return f;
    }

    /**
     * 冒泡排序
     */
    public void bubbleSort(){
        System.out.println("开始："+JSON.toJSONString(a));
        int out,in;
        for(out=nElems-1;out>1;out--){
            for(in=0;in<out;in++){
                if(a[in]>a[in+1]){
                    swap(in,in+1);
                }
            }
            System.out.println(JSON.toJSONString(a));
        }
    }

    /**
     * 插入排序
     */
    public void insertSort(){
        System.out.println("开始："+JSON.toJSONString(a));
        int in,out;
        for(out=1;out<nElems;out++){
            int temp=a[out];
            in=out;
            while (in>0&&a[in-1]>=temp){
                a[in]=a[in-1];
                --in;
                System.out.println(JSON.toJSONString(a));
            }
            a[in]=temp;
            System.out.println();
        }
    }

    /**
     * 选择排序
     */
    public void sellectSort(){
        System.out.println("开始："+JSON.toJSONString(a));
        int out,in,min;
        for(out=0;out<nElems-1;out++){
            min=out;
            for(in=out+1;in<nElems;in++){
                if(a[in]<a[min]){
                    min=in;
                }
                swap(out,min);

            }
            System.out.println(JSON.toJSONString(a));
        }
    }
    private void swap(int i,int j){
        int tem=a[j];
        a[j]=a[i];
        a[i]=tem;
        System.out.print(i+"->"+j+" ");
    }
    public void displayAll(){
        System.out.println("size:"+nElems);
        for(int i=0;i<a.length;i++){
            System.out.println(" "+a[i]);
        }
    }
}
